"""
私有化
封装：1.私有化属性   2.定义公有set和get方法
__属性：就是将属性私有化，访问范围仅仅限于类中
好处：
1.隐藏属性不被外界随意修改
2.也可以通过给出的特定函数修改
    def setXXX(self,xxx):
        3.筛选赋值的内容
          if xxx是否符合条件：
            赋值
          else：
            不赋值
4.如果想获取具体的某一个属性
  使用get函数
    def getXXX(self):
        return self.__xxx
"""


class Student:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age
        self.__score = 90

    # set是为了赋值
    def setAge(self, age):
        if age > 0 and age < 120:
            self.__age = age
        else:
            print("年龄不在规定的范围内")

    # get是为了取值
    def getAge(self):
        return self.__age

    def __str__(self):
        return f"姓名:{self.__name},年龄：{self.__age},考试分数:{self.__score}"
    # attribute:  setName  getName  __str__   __init__


sun_han = Student("sunhan", 20)
print(sun_han)
sun_han.setAge(100)
print(sun_han)

# 就想拿到孙涵的年龄
print(sun_han.getAge())

# 查看类中所有的属性
print(dir(Student))
print(dir(sun_han))

print(sun_han._Student__age, "\n")  # 其实它就是__age，只不过系统自动改名字了


# 在开发中的一些私有化处理：装饰器
class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    # 先有getXXX，（查看age）
    @property
    def age(self):
        return self.__age

    # 再有set，因为set依赖get，（输入,修改age）
    @age.setter
    def age(self, age):
        if age > 0 and age < 100:
            self.__age = age
        else:
            print("年龄不在规定的范围内")

    def __str__(self):
        return f"姓名:{self.__name},年龄：{self.__age}"


s = Student("Sunhan", 19)
s.name = "gouzi"
print(s.name)

# 加了装饰器以后就可以当成属性跟name一样的用了
s.age = 110  # 通过装饰器定义的setter方法设置私有属性age的值
print(s.age)
# 打印对象的所有属性和方法
print(s.__dir__(), "\n")
